package bancosys.tec.exception;

import java.util.Locale;

import bancosys.tec.i18n.MessageResolver;

/**
 * Objeto com implementação básica de LocalizedMessageHolder
 * 
 * @author lundberg
 */
public class MessageHolder implements LocalizedMessageHolder {

    private String bundleName;

    private String key;

    private Object[] arguments;

    /**
     * Construtor
     * 
     * @param bundleName bundleName
     * @param key key
     * @param arguments arguments
     */
    public MessageHolder(String bundleName, String key, Object... arguments) {
        this.bundleName = bundleName;
        this.key = key;
        this.arguments = arguments;
    }

    /**
     * Retorna a mensagem convertida no default locale. Caso não seja possível, devolve a chave.
     * 
     * @return A mensagem ou a chave.
     */
    public String getMessage() {
        return this.getMessage(Locale.getDefault());
    }

    /**
     * Retorna a mensagem convertida no default locale. Caso não seja possível, devolve a chave.
     * 
     * @param locale Locale
     * @return A mensagem ou a chave.
     */
    public String getMessage(Locale locale) {
        if (locale == null) {
            return "Impossible to resolve message: locale cannot be null. bundleName = '" + this.bundleName + "', key = '" + this.key
                    + "'.";
        }
        return MessageResolver.forLocale(locale).resolveMessage(this.bundleName, this.key, this.resolve(locale, this.arguments));
    }

    /**
     * Converte o array de arguments, fazendo com que instancias de LocalizedMessageHolder sejam traduzidas para o locale apropriado.
     * 
     * @param locale locale
     * @param args arguments
     * @return arguments convertidos
     */
    private Object[] resolve(Locale locale, Object[] args) {
        int n = args == null ? 0 : args.length;
        Object[] converted = new Object[n];
        for (int i = 0; i < n; i++) {
            if (args[i] instanceof LocalizedMessageHolder) {
                converted[i] = ((LocalizedMessageHolder) args[i]).getMessage(locale);
            } else {
                converted[i] = args[i];
            }
        }
        return converted;
    }
}
